package com.example.springbatch2;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import java.util.Map;

@SpringBootApplication
@EnableBatchProcessing //启用springbatch框架 需要的注解
public class SpirngbatchApplication2 {

    // job调度器
    @Autowired
    private JobLauncher jobLauncher;

    // job构建工厂
    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    // step步骤构建工厂
    @Autowired
    private StepBuilderFactory stepBuilderFactory;


    // 任务step执行逻辑由 tasklet完成
    @StepScope //等到调用的时候再加载这个bean对象
    @Bean
    public Tasklet tasklet1(@Value("#{jobParameters['name']}") String name){
        return (stepContribution, chunkContext) -> {
            // 方法1，直接通过chunkContext去获取jobParameter
//                Map<String, Object> jobParameters = chunkContext.getStepContext().getJobParameters();
//
//                Object name = jobParameters.get("name");
//                System.out.println("Hello Params !---" + name);

            // 方法2，通过延时加载去获取jobParameter

            System.out.println("Hello Pamams ! ---" + name);


            // 返回执行任务完成
            return RepeatStatus.FINISHED;
        };
    }

    // 作业步骤 不带不读写操作
    @Bean
    public Step step1(){
        // 如果是通过延时加载去获取参数 那么这里的入参就置为null
        return stepBuilderFactory.get("step1").tasklet(tasklet1(null)).build();
    }

    @Bean
    public Job job(){
        return jobBuilderFactory.get("hello-job").start(step1()).build();
    }

    public static void main(String[] args) {
        SpringApplication.run(SpirngbatchApplication2.class, args);
    }

}
